#pragma once

#include"lars_reactor.h"
#include"lars.pb.h"
#include"lars_dns.h"
#include"config_file.h"
#include"route_lb.h"

// 全局的一些配置
struct data_config{
    int udp_server_cnt;             // udp的线程个数
    std::string udp_server_ip;      // reactor service的IP地址

    std::string dns_ip;             // dns service 的IP地址
    int dns_port;                   // dns service 的port

    std::string reporter_ip;        // reporter service 的IP地址
    int reporter_port;              // reporter service 的port

    int lb_probe_num;               // loadbalance中idle_list和overload_list的选择阈值
    int lb_init_succ_cnt;           // 初始化一个host_info主机访问的成功次数，防止刚启动时少量失败就认为overload
    int lb_init_err_cnt;            // 如果一个idle结点被判定为overload，防止只成功一次就判定为idle
    float lb_err_rate;              // 当idle结点失败率高于此值，结点变为overload
    float lb_succ_rate;             // 当overload结点成功率高于此值，结点变为idle
    int lb_contin_err_limit;        // 当idle结点连续失败次数高于此值，结点变为overload
    int lb_contin_succ_limit;       // 当overload结点连续成功次数高于此值，结点变为idle
    int lb_idle_timeout;            // host在idle列表中一定时间下清理一次基础信息，防止成功次数太多，导致err计算偏小
    int lb_overload_timeout;        // host在overload列表中等待的最大时间，尝试将其移入idle中
    long lb_update_timeout;         // 对于每个NEW状态的modid和cmdid，多久从远程dns更新一次本地路由

};

extern struct data_config config;

//与report_client通信的thread_queue消息队列
extern thread_queue<lars::ReportStatusRequest>* report_queue;
//与dns_client通信的thread_queue消息队列
extern thread_queue<lars::GetRouteRequest>* dns_queue;

// 给每一个agent udp server 定义一个route_lb
extern route_lb* r_lb[3];

// 启动多个UDP服务器函数
void start_udp_server(void *args);

// 启动report客户端的函数
void start_report_client(void *args);

// 启动dns客户端的函数
void start_dns_client(void *args);